package cursopoo

descripcionMetodosObject(new Punto(), new Punto())
descripcionMetodosObject(new PuntoExtendido(), new PuntoExtendido())

def descripcionMetodosObject(punto, otroPunto) {
    println 'Todos los objetos heredan de: ' + punto.getClass().getSuperclass()
    println '\nObject define los siguientes metodos: '
    println 'getClass()   - punto.getClass() = ' + punto.getClass()
    println 'hashCode() - punto.hashCode() = ' + punto.hashCode()
    println "equals(obj)  - punto.equals('otro obj') = " + punto.equals('otro obj')
    println "                  - punto.equals(punto) = " + punto.equals(punto)
    println "                  - punto.equals(otroPunto) = " + punto.equals(otroPunto)
    println 'toString()    - punto.toString() = ' + punto.toString()
    println '\nAdemas define notify/notifyAll/wait'
    println '\nExtensiones utiles de Groovy:'
    println 'dump() - punto.dump() = ' + punto.dump()
    println 'inspect() - punto.inspect() = ' + punto.inspect()
    println "respondsTo(msgName) - punto.respondsTo('distancia') = " + punto.respondsTo('distancia')
    println "invokeMethod(msgName) - punto.invokeMethod('distancia') = " + punto.invokeMethod('distancia', null)

}

class Punto {
    def x = 10
    def y = 20
    def distancia() {
        Math.sqrt(x*x + y*y)
    }
}
class PuntoExtendido extends Punto {
    // getClass NO se puede extender

}